package demo.mock;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;

import static com.github.tomakehurst.wiremock.client.WireMock.configureFor;

/**
 * WireMock 是一个用于模拟 HTTP 服务的开源工具，主要用于测试和开发场景。
 * 它可以帮助开发者在没有真实后端服务的情况下，模拟出 HTTP 请求和响应，从而方便进行集成测试、API 测试和开发调试。
 * <p>
 * 主要功能：
 *
 * <li>模拟 HTTP 请求和响应：可以定义特定的请求路径、方法、参数等，并返回自定义的响应内容。
 * <li>动态响应：支持根据请求内容生成动态响应，例如根据请求参数返回不同的结果。
 * <li>请求验证：可以验证是否收到了特定的请求，以及请求的内容是否符合预期。
 * <li>延迟响应：可以模拟网络延迟，测试客户端在延迟情况下的行为。
 * <li>记录和回放：可以记录真实的 HTTP 请求和响应，并在后续测试中回放这些记录。
 * <li>支持 HTTPS：可以模拟 HTTPS 服务，方便测试加密通信场景。
 * <li>丰富的匹配规则：支持多种请求匹配规则，例如 URL、Header、Body 等。
 *
 * <p>
 * 使用场景：
 * <li>API 测试：在开发 API 客户端时，可以使用 WireMock 模拟后端服务，测试客户端的各种行为。
 * <li>集成测试：在微服务架构中，可以使用 WireMock 模拟依赖的服务，进行集成测试。
 * <li>开发调试：在没有真实后端服务的情况下，开发者可以使用 WireMock 快速搭建一个模拟环境，进行开发和调试。
 */
public class WireMockTest {

    public static void main(String[] args) {
        WireMockServer wireMockServer = new WireMockServer();
        wireMockServer.start();

        configureFor("localhost", 8080);
        WireMock.stubFor(
                WireMock.get(WireMock.urlEqualTo("/api/resource"))
                        .willReturn(WireMock.aResponse()
                                .withStatus(200)
                                .withBody("{\"message\": \"Hello, WireMock!\"}")));

        // 在这里进行测试
        HttpResponse<String> res = Unirest.get("http://localhost:8080/api/resource").asString();
        System.err.println(res.getBody());

        wireMockServer.stop();
    }
}
